package db

import (
	"mygindemo/config"
	"mygindemo/model"

	"github.com/ahviplc/GoJustToolc/UConsole"
	"github.com/ahviplc/GoJustToolc/UUtils/UStringUtil"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

// 数据库db类 工具类

// 初始化db函数
func InitDB() (db *gorm.DB, err error) {
	// 1.连接mysql数据库
	db, err = gorm.Open(config.Mysql_Dialect, config.Mysql_Link_Info)
	if err != nil {
		panic(err)
	}
	return db, err
}

// 新增数据库
func InsertDB() {
	// 打印数据库连接信息
	UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 创建数据用来新增
	for i := 1; i <= 100; i++ {
		user := model.User{Name: "LC" + UStringUtil.IntToString(i), Age: 18}
		// 4.执行创建新增操作
		// UConsole.Log("flag:", db.NewRecord(user)) // 主键为空返回`true`
		db.Debug().Create(&user) // 创建user
		// UConsole.Log("flag:", db.NewRecord(user)) // 创建`user`后返回`false`
	}
}

//  根据主键查询第一条记录
func FindFirstOneUserDB() model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 执行查询第一条记录的操作
	var user model.User // 声明模型结构体类型变量user
	// user := new(model.User) //new和make的区别
	db.Debug().First(&user)
	return user
}

//  根据主键查询第一条记录 使用new 返回指针版本
func FindFirstOneUserDB2() *model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 执行查询第一条记录的操作
	// var user model.User // 声明模型结构体类型变量user
	user := new(model.User) //new和make的区别
	db.Debug().First(&user)
	return user
}

//  查询指定的某条记录(仅当主键为整型时可用)
func FindOneUserByIdDB(id int) model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 查询指定的某条记录(仅当主键为整型时可用)
	var user model.User
	db.Debug().First(&user, id)
	return user
}

//  随机获取一条记录
func FindTaketOneUserDB() model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 执行查询随机获取一条记录的操作
	var user model.User
	db.Debug().Take(&user)
	return user
}

//  根据主键查询最后一条记录
func FindLastOneUserDB() model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 执行查询最后一条记录的操作
	var user model.User
	db.Debug().Last(&user)
	return user
}

// 查询全部User数据
func FindAllUsersDB() []model.User {
	// 打印数据库连接信息
	// UConsole.Log(config.Mysql_Link_Info) // root:root@(127.0.0.1:3306)/mygindemo?charset=utf8&parseTime=True&loc=Local

	// 1.连接mysql数据库
	db, _ := InitDB()
	// 定义defer 关闭数据库连接
	defer db.Close()

	// 2. 把模型与数据库中的表对应起来
	db.AutoMigrate(&model.User{})

	// 3. 执行查询全部的操作
	var users []model.User
	db.Debug().Find(&users)
	return users
}
